package gradle.mybatis.common.utils;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页工具类
 */
public class PageUtil {

    /**
     * 默认页数
     */
    public static final int DEFAULT_PAGE_NUM = 1;

    /**
     * 默认每页显示数
     */
    public static final int DEFAULT_PAGE_SIZE = 10;

    /**
     * 开启分页
     *
     * @param pageNum   查询页数
     * @param pagerSize 每页显示数
     * @return 分页Page对象
     */
    public static <E> Page<E> startPage(Integer pageNum, Integer pagerSize) {
        return PageHelper.startPage(pageNum == null ? DEFAULT_PAGE_NUM : pageNum, pagerSize == null ? DEFAULT_PAGE_SIZE : pagerSize);
    }

    /**
     * 开启分页
     *
     * @param pageNum   查询页数
     * @param pagerSize 每页显示数
     * @param orderBy   排序
     * @return 分页Page对象
     */
    public static <E> Page<E> startPage(Integer pageNum, Integer pagerSize, String orderBy) {
        Page<E> page = PageHelper.startPage(pageNum == null ? DEFAULT_PAGE_NUM : pageNum, pagerSize == null ? DEFAULT_PAGE_SIZE : pagerSize);
        page.setOrderBy(orderBy);
        return page;
    }


    /**
     * 根据当前集合计算结果
     *
     * @param resultList 分页结果
     * @param pageNum    查询页数
     * @param pageSize   每页显示数
     * @return 分页结果
     */
    public static <E> List<E> listPage(List<E> resultList, Integer pageNum, Integer pageSize) {
        // 目前的请求的数量
        int startSize = (pageNum - 1) * pageSize;
        int endSize = pageNum * pageSize;
        // 是否有余数
        boolean remainder = resultList.size() % pageSize != 0;
        // 有余数 最后加上一页
        int totalNum = remainder ? (resultList.size() / pageSize) + 1 : resultList.size() / pageSize;

        List<E> resultKeywordFeatureList;
        if (pageNum <= totalNum) {
            // 如果最后的截取位置大于集合的数量
            if (endSize < resultList.size()) {
                resultKeywordFeatureList = resultList.subList(startSize, endSize);
            } else {
                resultKeywordFeatureList = resultList.subList(startSize, resultList.size());
            }
            return resultKeywordFeatureList;
        } else {
            return new ArrayList<>();
        }
    }

}
